#this lines of code install these packages in your RStudio workspace
install.packages("dplyr")
Error in install.packages : Updating loaded packages
install.packages("leaflet")
Error in install.packages : Updating loaded packages
install.packages("ggplot2")
Error in install.packages : Updating loaded packages
install.packages("ggplot")
Warning in install.packages :
  package ‘ggplot’ is not available for this version of R

A version of this package for your version of R might be available elsewhere,
see the ideas at
https://cran.r-project.org/doc/manuals/r-patched/R-admin.html#Installing-packages
install.packages("plotly")
Error in install.packages : Updating loaded packages
#this code invoke the same packages in your open Rmarkdown file (which is this file that you are reading now)
#to plot and visualize your data
library(sf)
library(sp)
library(ggplot2)
library(dplyr)
library(leaflet)
library(plotly)
library(sfheaders)
library(survival)
library(survminer)

Loading the causes data.

From the Monarch Bills I’ve created 4 different data frames, one for each of the illnesses that I’ve extracted so far; infant, chrisoms, stillborne, and abortive. Each data frame contained the parish name, standardized to the Omeka form, and the counts per year starting off from 1665, to 1669. I am going to send you de data sets, so you can load them from your directory.

abortive <- read.csv("/Users/hernanadasme/Projects/bom/abortive_1665_1669.csv")
stilborne <- read.csv("/Users/hernanadasme/Projects/bom/stilborne_1665_1669.csv")
infant <- read.csv("/Users/hernanadasme/Projects/bom/infant_1665_1669.csv")
chrisoms <- read.csv("/Users/hernanadasme/Projects/bom/chrisoms_1665_1669.csv")

check the one of the data frames

head(abortive)

Loading the parishes polygons

Here I am loading a shapefile. Shapefiles are a collection of files that contain geo referenced data. You only need to pull the file with the .shp extension and it will load all the required files. I will send you this file too, and we can load it into a folder. Here we are using the parishes from 1671; I am only assuming that those would be more accurate for the type of analysis that we want to do.

parishes_1671 <- st_read("//Users/hernanadasme/Projects/bom/parish-shapefiles/WithinTheBills1671/WithinTheBills1671.shp")
Reading layer `WithinTheBills1671' from data source `/Users/hernanadasme/Projects/bom/parish-shapefiles/WithinTheBills1671/WithinTheBills1671.shp' using driver `ESRI Shapefile'
Simple feature collection with 132 features and 8 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 525498.1 ymin: 170682.5 xmax: 537668.6 ymax: 188172.2
Projected CRS: OSGB36 / British National Grid

Merging the parishes data with the individual diseases data frames

I standardized the names of the parishes to match them with one of the possible names in the data set that contains the parishes polygons. That explains why the diseases data sets have a column named OMEKA_PAR, which matches with the same column in the 1671 parishes shape file. Having the same column allow us to merge the data frames and create one data frame with the parish name, the cause of death, the counts per year, and the georeferenced data with the polygons. I will perform two types of joins: left join and inner join.

Inner join:

An inner join only includes rows that have matching values in both the left and right tables.. In this case, only includes the parishes which contain data from the original abortive data frame.

# Perform a left join to combine the data based on a shared parish identifier. e.
map_abortive <- inner_join(parishes_1671, abortive, by = "OMEKA_PAR")

check the data

#to better see the data, we can transform the joined table into a data frame view
map_abortive_df <- as.data.frame(map_abortive)
map_abortive_df

Mapping the left joined data

centroids <- st_centroid(map_abortive$geometry)

# Add centroids to the data frame
map_abortive$centroid_x <- st_coordinates(centroids)[, "X"]
map_abortive$centroid_y <- st_coordinates(centroids)[, "Y"]

plot_av <- ggplot(data = map_abortive , aes(fill = X1669 )) +
  geom_sf() +
  geom_text(aes(x = centroid_x, y = centroid_y, label = OMEKA_PAR),
            color = "grey", size = 1, show.legend = FALSE, alpha=0)+
  scale_fill_gradient(low = "white", high = "red", na.value = "gray",
                      breaks = c(0, 100, 200, 300, 400, 500, 600, 700, 800),
                      labels = scales::comma_format()) +
  theme_void()

# Convert ggplot to plotly
plotly_map <- ggplotly(plot_av)

# Display the interactive plot
plotly_map

Left join:

A left join includes all the rows from the left (or first) table and matching rows from the right (or second) table. In this case, includes the parishes which contain data from the original abortive data frame and all the 106 parishes with no data, from the shapefile

leftjoined_abortive <- left_join(parishes_1671, abortive, by = "OMEKA_PAR")
map_leftjoined_abortive <- as.data.frame(leftjoined_abortive)
map_leftjoined_abortive
centroids <- st_centroid(leftjoined_abortive$geometry)

# Add centroids to the data frame
leftjoined_abortive$centroid_x <- st_coordinates(centroids)[, "X"]
leftjoined_abortive$centroid_y <- st_coordinates(centroids)[, "Y"]

plot_av_all <- ggplot(data = leftjoined_abortive , aes(fill = X1665 )) +
  geom_sf() +
  geom_text(aes(x = centroid_x, y = centroid_y, label = OMEKA_PAR),
            color = "grey", size = 1, show.legend = FALSE, alpha=0)+
  scale_fill_gradient(low = "white", high = "red", na.value = "gray",
                      breaks = c(0, 100, 200, 300, 400, 500, 600, 700, 800),
                      labels = scales::comma_format()) +
  theme_void()

# Convert ggplot to plotly
plotly_map_all <- ggplotly(plot_av_all)

# Display the interactive plot
plotly_map_all

Now we do the same with the infants data set

leftjoined_infant <- left_join(parishes_1671, infant, by = "OMEKA_PAR")
map_infants_df <- as.data.frame(leftjoined_infant)
map_infants_df
centroids <- st_centroid(leftjoined_infant$geometry)

# Add centroids to the data frame
leftjoined_infant$centroid_x <- st_coordinates(centroids)[, "X"]
leftjoined_infant$centroid_y <- st_coordinates(centroids)[, "Y"]

plot_inf_all <- ggplot(data = leftjoined_infant, aes(fill = X1669 )) +
  geom_sf() +
  geom_text(aes(x = centroid_x, y = centroid_y, label = OMEKA_PAR),
            color = "grey", size = 1, show.legend = FALSE, alpha=0)+
  scale_fill_gradient(low = "white", high = "red", na.value = "gray",
                      breaks = c(0, 100, 200, 300, 400, 500, 600, 700, 800),
                      labels = scales::comma_format()) +
  theme_void()

# Convert ggplot to plotly
plotly_inf_all <- ggplotly(plot_inf_all)

# Display the interactive plot
plotly_inf_all
LS0tCnRpdGxlOiAiSW5mYW50IENhdXNlcyBvZiBEZWF0aDogTW9uYXJjaCBCaWxscyAxNjY1IC0gMTY2OSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CiN0aGlzIGxpbmVzIG9mIGNvZGUgaW5zdGFsbCB0aGVzZSBwYWNrYWdlcyBpbiB5b3VyIFJTdHVkaW8gd29ya3NwYWNlCmluc3RhbGwucGFja2FnZXMoImRwbHlyIikKaW5zdGFsbC5wYWNrYWdlcygibGVhZmxldCIpCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQppbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QiKQppbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQpgYGAKCmBgYHtyfQojdGhpcyBjb2RlIGludm9rZSB0aGUgc2FtZSBwYWNrYWdlcyBpbiB5b3VyIG9wZW4gUm1hcmtkb3duIGZpbGUgKHdoaWNoIGlzIHRoaXMgZmlsZSB0aGF0IHlvdSBhcmUgcmVhZGluZyBub3cpCiN0byBwbG90IGFuZCB2aXN1YWxpemUgeW91ciBkYXRhCmxpYnJhcnkoc2YpCmxpYnJhcnkoc3ApCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShzZmhlYWRlcnMpCmxpYnJhcnkoc3Vydml2YWwpCmxpYnJhcnkoc3Vydm1pbmVyKQpgYGAKCiMjIyBMb2FkaW5nIHRoZSBjYXVzZXMgZGF0YS4KCkZyb20gdGhlIE1vbmFyY2ggQmlsbHMgSSd2ZSBjcmVhdGVkIDQgZGlmZmVyZW50IGRhdGEgZnJhbWVzLCBvbmUgZm9yIGVhY2ggb2YgdGhlIGlsbG5lc3NlcyB0aGF0IEkndmUgZXh0cmFjdGVkIHNvIGZhcjsgaW5mYW50LCBjaHJpc29tcywgc3RpbGxib3JuZSwgYW5kIGFib3J0aXZlLiBFYWNoIGRhdGEgZnJhbWUgY29udGFpbmVkIHRoZSBwYXJpc2ggbmFtZSwgc3RhbmRhcmRpemVkIHRvIHRoZSBPbWVrYSBmb3JtLCBhbmQgdGhlIGNvdW50cyBwZXIgeWVhciBzdGFydGluZyBvZmYgZnJvbSAxNjY1LCB0byAxNjY5LiBJIGFtIGdvaW5nIHRvIHNlbmQgeW91IGRlIGRhdGEgc2V0cywgc28geW91IGNhbiBsb2FkIHRoZW0gZnJvbSB5b3VyIGRpcmVjdG9yeS4KCmBgYHtyfQphYm9ydGl2ZSA8LSByZWFkLmNzdigiL1VzZXJzL2hlcm5hbmFkYXNtZS9Qcm9qZWN0cy9ib20vYWJvcnRpdmVfMTY2NV8xNjY5LmNzdiIpCnN0aWxib3JuZSA8LSByZWFkLmNzdigiL1VzZXJzL2hlcm5hbmFkYXNtZS9Qcm9qZWN0cy9ib20vc3RpbGJvcm5lXzE2NjVfMTY2OS5jc3YiKQppbmZhbnQgPC0gcmVhZC5jc3YoIi9Vc2Vycy9oZXJuYW5hZGFzbWUvUHJvamVjdHMvYm9tL2luZmFudF8xNjY1XzE2NjkuY3N2IikKY2hyaXNvbXMgPC0gcmVhZC5jc3YoIi9Vc2Vycy9oZXJuYW5hZGFzbWUvUHJvamVjdHMvYm9tL2Nocmlzb21zXzE2NjVfMTY2OS5jc3YiKQpgYGAKCmNoZWNrIHRoZSBvbmUgb2YgdGhlIGRhdGEgZnJhbWVzCgpgYGB7cn0KaGVhZChhYm9ydGl2ZSkKYGBgCgojIyMgTG9hZGluZyB0aGUgcGFyaXNoZXMgcG9seWdvbnMKCkhlcmUgSSBhbSBsb2FkaW5nIGEgc2hhcGVmaWxlLiBTaGFwZWZpbGVzIGFyZSBhIGNvbGxlY3Rpb24gb2YgZmlsZXMgdGhhdCBjb250YWluIGdlbyByZWZlcmVuY2VkIGRhdGEuIFlvdSBvbmx5IG5lZWQgdG8gcHVsbCB0aGUgZmlsZSB3aXRoIHRoZSAuc2hwIGV4dGVuc2lvbiBhbmQgaXQgd2lsbCBsb2FkIGFsbCB0aGUgcmVxdWlyZWQgZmlsZXMuIEkgd2lsbCBzZW5kIHlvdSB0aGlzIGZpbGUgdG9vLCBhbmQgd2UgY2FuIGxvYWQgaXQgaW50byBhIGZvbGRlci4gSGVyZSB3ZSBhcmUgdXNpbmcgdGhlIHBhcmlzaGVzIGZyb20gMTY3MTsgSSBhbSBvbmx5IGFzc3VtaW5nIHRoYXQgdGhvc2Ugd291bGQgYmUgbW9yZSBhY2N1cmF0ZSBmb3IgdGhlIHR5cGUgb2YgYW5hbHlzaXMgdGhhdCB3ZSB3YW50IHRvIGRvLgoKYGBge3J9CnBhcmlzaGVzXzE2NzEgPC0gc3RfcmVhZCgiLy9Vc2Vycy9oZXJuYW5hZGFzbWUvUHJvamVjdHMvYm9tL3BhcmlzaC1zaGFwZWZpbGVzL1dpdGhpblRoZUJpbGxzMTY3MS9XaXRoaW5UaGVCaWxsczE2NzEuc2hwIikKYGBgCgojIyMgTWVyZ2luZyB0aGUgcGFyaXNoZXMgZGF0YSB3aXRoIHRoZSBpbmRpdmlkdWFsIGRpc2Vhc2VzIGRhdGEgZnJhbWVzCgpJIHN0YW5kYXJkaXplZCB0aGUgbmFtZXMgb2YgdGhlIHBhcmlzaGVzIHRvIG1hdGNoIHRoZW0gd2l0aCBvbmUgb2YgdGhlIHBvc3NpYmxlIG5hbWVzIGluIHRoZSBkYXRhIHNldCB0aGF0IGNvbnRhaW5zIHRoZSBwYXJpc2hlcyBwb2x5Z29ucy4gVGhhdCBleHBsYWlucyB3aHkgdGhlIGRpc2Vhc2VzIGRhdGEgc2V0cyBoYXZlIGEgY29sdW1uIG5hbWVkIE9NRUtBX1BBUiwgd2hpY2ggbWF0Y2hlcyB3aXRoIHRoZSBzYW1lIGNvbHVtbiBpbiB0aGUgMTY3MSBwYXJpc2hlcyBzaGFwZSBmaWxlLiBIYXZpbmcgdGhlIHNhbWUgY29sdW1uIGFsbG93IHVzIHRvIG1lcmdlIHRoZSBkYXRhIGZyYW1lcyBhbmQgY3JlYXRlIG9uZSBkYXRhIGZyYW1lIHdpdGggdGhlIHBhcmlzaCBuYW1lLCB0aGUgY2F1c2Ugb2YgZGVhdGgsIHRoZSBjb3VudHMgcGVyIHllYXIsIGFuZCB0aGUgZ2VvcmVmZXJlbmNlZCBkYXRhIHdpdGggdGhlIHBvbHlnb25zLiBJIHdpbGwgcGVyZm9ybSB0d28gdHlwZXMgb2Ygam9pbnM6IGxlZnQgam9pbiBhbmQgaW5uZXIgam9pbi4KCiMjIyMgSW5uZXIgam9pbjoKCkFuIGlubmVyIGpvaW4gb25seSBpbmNsdWRlcyByb3dzIHRoYXQgaGF2ZSBtYXRjaGluZyB2YWx1ZXMgaW4gYm90aCB0aGUgbGVmdCBhbmQgcmlnaHQgdGFibGVzLi4gSW4gdGhpcyBjYXNlLCBvbmx5IGluY2x1ZGVzIHRoZSBwYXJpc2hlcyB3aGljaCBjb250YWluIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgYWJvcnRpdmUgZGF0YSBmcmFtZS4KCmBgYHtyfQojIFBlcmZvcm0gYSBsZWZ0IGpvaW4gdG8gY29tYmluZSB0aGUgZGF0YSBiYXNlZCBvbiBhIHNoYXJlZCBwYXJpc2ggaWRlbnRpZmllci4gZS4KbWFwX2Fib3J0aXZlIDwtIGlubmVyX2pvaW4ocGFyaXNoZXNfMTY3MSwgYWJvcnRpdmUsIGJ5ID0gIk9NRUtBX1BBUiIpCmBgYAoKY2hlY2sgdGhlIGRhdGEKCmBgYHtyfQojdG8gYmV0dGVyIHNlZSB0aGUgZGF0YSwgd2UgY2FuIHRyYW5zZm9ybSB0aGUgam9pbmVkIHRhYmxlIGludG8gYSBkYXRhIGZyYW1lIHZpZXcKbWFwX2Fib3J0aXZlX2RmIDwtIGFzLmRhdGEuZnJhbWUobWFwX2Fib3J0aXZlKQptYXBfYWJvcnRpdmVfZGYKYGBgCgpNYXBwaW5nIHRoZSBsZWZ0IGpvaW5lZCBkYXRhCgpgYGB7cn0KY2VudHJvaWRzIDwtIHN0X2NlbnRyb2lkKG1hcF9hYm9ydGl2ZSRnZW9tZXRyeSkKCiMgQWRkIGNlbnRyb2lkcyB0byB0aGUgZGF0YSBmcmFtZQptYXBfYWJvcnRpdmUkY2VudHJvaWRfeCA8LSBzdF9jb29yZGluYXRlcyhjZW50cm9pZHMpWywgIlgiXQptYXBfYWJvcnRpdmUkY2VudHJvaWRfeSA8LSBzdF9jb29yZGluYXRlcyhjZW50cm9pZHMpWywgIlkiXQoKcGxvdF9hdiA8LSBnZ3Bsb3QoZGF0YSA9IG1hcF9hYm9ydGl2ZSAsIGFlcyhmaWxsID0gWDE2NjkgKSkgKwogIGdlb21fc2YoKSArCiAgZ2VvbV90ZXh0KGFlcyh4ID0gY2VudHJvaWRfeCwgeSA9IGNlbnRyb2lkX3ksIGxhYmVsID0gT01FS0FfUEFSKSwKICAgICAgICAgICAgY29sb3IgPSAiZ3JleSIsIHNpemUgPSAxLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBhbHBoYT0wKSsKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJ3aGl0ZSIsIGhpZ2ggPSAicmVkIiwgbmEudmFsdWUgPSAiZ3JheSIsCiAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDEwMCwgMjAwLCAzMDAsIDQwMCwgNTAwLCA2MDAsIDcwMCwgODAwKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6Y29tbWFfZm9ybWF0KCkpICsKICB0aGVtZV92b2lkKCkKCiMgQ29udmVydCBnZ3Bsb3QgdG8gcGxvdGx5CnBsb3RseV9tYXAgPC0gZ2dwbG90bHkocGxvdF9hdikKCiMgRGlzcGxheSB0aGUgaW50ZXJhY3RpdmUgcGxvdApwbG90bHlfbWFwCmBgYAoKIyMjIyBMZWZ0IGpvaW46CgpBIGxlZnQgam9pbiBpbmNsdWRlcyBhbGwgdGhlIHJvd3MgZnJvbSB0aGUgbGVmdCAob3IgZmlyc3QpIHRhYmxlIGFuZCBtYXRjaGluZyByb3dzIGZyb20gdGhlIHJpZ2h0IChvciBzZWNvbmQpIHRhYmxlLiBJbiB0aGlzIGNhc2UsIGluY2x1ZGVzIHRoZSBwYXJpc2hlcyB3aGljaCBjb250YWluIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgYWJvcnRpdmUgZGF0YSBmcmFtZSBhbmQgYWxsIHRoZSAxMDYgcGFyaXNoZXMgd2l0aCBubyBkYXRhLCBmcm9tIHRoZSBzaGFwZWZpbGUKCmBgYHtyfQpsZWZ0am9pbmVkX2Fib3J0aXZlIDwtIGxlZnRfam9pbihwYXJpc2hlc18xNjcxLCBhYm9ydGl2ZSwgYnkgPSAiT01FS0FfUEFSIikKbWFwX2xlZnRqb2luZWRfYWJvcnRpdmUgPC0gYXMuZGF0YS5mcmFtZShsZWZ0am9pbmVkX2Fib3J0aXZlKQptYXBfbGVmdGpvaW5lZF9hYm9ydGl2ZQpgYGAKCmBgYHtyfQpjZW50cm9pZHMgPC0gc3RfY2VudHJvaWQobGVmdGpvaW5lZF9hYm9ydGl2ZSRnZW9tZXRyeSkKCiMgQWRkIGNlbnRyb2lkcyB0byB0aGUgZGF0YSBmcmFtZQpsZWZ0am9pbmVkX2Fib3J0aXZlJGNlbnRyb2lkX3ggPC0gc3RfY29vcmRpbmF0ZXMoY2VudHJvaWRzKVssICJYIl0KbGVmdGpvaW5lZF9hYm9ydGl2ZSRjZW50cm9pZF95IDwtIHN0X2Nvb3JkaW5hdGVzKGNlbnRyb2lkcylbLCAiWSJdCgpwbG90X2F2X2FsbCA8LSBnZ3Bsb3QoZGF0YSA9IGxlZnRqb2luZWRfYWJvcnRpdmUgLCBhZXMoZmlsbCA9IFgxNjY1ICkpICsKICBnZW9tX3NmKCkgKwogIGdlb21fdGV4dChhZXMoeCA9IGNlbnRyb2lkX3gsIHkgPSBjZW50cm9pZF95LCBsYWJlbCA9IE9NRUtBX1BBUiksCiAgICAgICAgICAgIGNvbG9yID0gImdyZXkiLCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgYWxwaGE9MCkrCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAid2hpdGUiLCBoaWdoID0gInJlZCIsIG5hLnZhbHVlID0gImdyYXkiLAogICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCAxMDAsIDIwMCwgMzAwLCA0MDAsIDUwMCwgNjAwLCA3MDAsIDgwMCksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6OmNvbW1hX2Zvcm1hdCgpKSArCiAgdGhlbWVfdm9pZCgpCgojIENvbnZlcnQgZ2dwbG90IHRvIHBsb3RseQpwbG90bHlfbWFwX2FsbCA8LSBnZ3Bsb3RseShwbG90X2F2X2FsbCkKCiMgRGlzcGxheSB0aGUgaW50ZXJhY3RpdmUgcGxvdApwbG90bHlfbWFwX2FsbApgYGAKCiMjIyMgTm93IHdlIGRvIHRoZSBzYW1lIHdpdGggdGhlIGluZmFudHMgZGF0YSBzZXQKCmBgYHtyfQpsZWZ0am9pbmVkX2luZmFudCA8LSBsZWZ0X2pvaW4ocGFyaXNoZXNfMTY3MSwgaW5mYW50LCBieSA9ICJPTUVLQV9QQVIiKQpgYGAKCmBgYHtyfQptYXBfaW5mYW50c19kZiA8LSBhcy5kYXRhLmZyYW1lKGxlZnRqb2luZWRfaW5mYW50KQptYXBfaW5mYW50c19kZgpgYGAKCmBgYHtyfQpjZW50cm9pZHMgPC0gc3RfY2VudHJvaWQobGVmdGpvaW5lZF9pbmZhbnQkZ2VvbWV0cnkpCgojIEFkZCBjZW50cm9pZHMgdG8gdGhlIGRhdGEgZnJhbWUKbGVmdGpvaW5lZF9pbmZhbnQkY2VudHJvaWRfeCA8LSBzdF9jb29yZGluYXRlcyhjZW50cm9pZHMpWywgIlgiXQpsZWZ0am9pbmVkX2luZmFudCRjZW50cm9pZF95IDwtIHN0X2Nvb3JkaW5hdGVzKGNlbnRyb2lkcylbLCAiWSJdCgpwbG90X2luZl9hbGwgPC0gZ2dwbG90KGRhdGEgPSBsZWZ0am9pbmVkX2luZmFudCwgYWVzKGZpbGwgPSBYMTY2OSApKSArCiAgZ2VvbV9zZigpICsKICBnZW9tX3RleHQoYWVzKHggPSBjZW50cm9pZF94LCB5ID0gY2VudHJvaWRfeSwgbGFiZWwgPSBPTUVLQV9QQVIpLAogICAgICAgICAgICBjb2xvciA9ICJncmV5Iiwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRkFMU0UsIGFscGhhPTApKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIndoaXRlIiwgaGlnaCA9ICJyZWQiLCBuYS52YWx1ZSA9ICJncmF5IiwKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMTAwLCAyMDAsIDMwMCwgNDAwLCA1MDAsIDYwMCwgNzAwLCA4MDApLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpjb21tYV9mb3JtYXQoKSkgKwogIHRoZW1lX3ZvaWQoKQoKIyBDb252ZXJ0IGdncGxvdCB0byBwbG90bHkKcGxvdGx5X2luZl9hbGwgPC0gZ2dwbG90bHkocGxvdF9pbmZfYWxsKQoKIyBEaXNwbGF5IHRoZSBpbnRlcmFjdGl2ZSBwbG90CnBsb3RseV9pbmZfYWxsCmBgYAo=